{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| 使用位置                        | 作用域 / 生命周期                                        | 行为与语义说明                                               | 常见用法与注意事项                                           |\n",
    "| ------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |\n",
    "| 函数外部（全局/命名空间作用域） | **内部链接（internal linkage）**                         | 将符号可见性限制在当前翻译单元（.cpp）内，防止外部链接冲突。 | 常用于隐藏实现细节；C++17 起可改用 `namespace {}` 或 `static` 变量 + `constexpr`，或改为 `inline` 变量。 |\n",
    "| 函数内部的局部变量              | **局部作用域 + 静态存储期（程序整个生命周期）**          | 首次执行到定义处时初始化一次，之后保持值；是线程安全的（C++11 起保证）。 | 懒汉式单例、缓存对象；注意析构顺序（在程序结束时执行），以及跨线程访问需同步。 |\n",
    "| 类内静态数据成员                | **归类所有对象共享**                                     | 需在类外提供一次性定义（C++17 起 `inline static` 可免定义）；允许在无对象时访问。 | 存储全局状态、常量表；记得在实现文件定义或使用 `inline static`。 |\n",
    "| 类内静态成员函数                | **无隐式 `this` 指针**                                   | 只能访问静态成员或通过对象/指针访问非静态成员；可作为普通函数使用，仅在语义上归类管理。 | 工具函数、工厂函数；可传递给 C API 作函数指针；不可被 `virtual` 修饰。 |\n",
    "| `static` 与匿名 namespace 结合  | **文件局部可见性 + 编译期唯一实例**                      | 匿名 namespace 产生内部链接；在其中定义的 `static` 可读性略差，通常二择其一即可。 | 建议任选一种方式隐藏实现细节即可，避免重复。                 |\n",
    "| `static` 在模板实例化中         | **每个模板实例拥有独立的静态对象**                       | 相同模板参数共享同一个静态对象；不同模板参数各自独立。       | 常用于模板级缓存；注意模板多次定义导致的 ODR（One Definition Rule）问题。 |\n",
    "| `static` 与线程局部存储         | 使用 `static thread_local` 组合获得 **线程局部静态对象** | 每个线程有独立实例，线程第一次访问时才初始化；程序退出时按线程销毁顺序析构。 | 用于线程独占缓存、统计；注意线程结束时的析构开销以及与 `pthread_key` 等平台 API 的差异。 |\n",
    "\n",
    "> 📌 **提示**：`static` 的含义依赖上下文（存储期 / 链接属性 / 成员共享），阅读代码时务必结合位置判断。C++11 起还可与 `constexpr`、`inline`、`thread_local` 等关键字组合，形成更细粒度的语义。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. **管理 `static` 的生命周期**：在多线程或复杂系统中，显式控制静态对象的初始化顺序与析构顺序，可借助懒初始化、`atexit` 注册或更安全的依赖注入。\n",
    "2. **与 `constexpr` 配合**：对编译期常量，优先使用 `constexpr` 替代 `static const`（在头文件中可自动具备内联语义，避免多重定义）。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
